<?php

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Service
 * @subpackage Delicious
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: Post.php 16211 2009-06-21 19:23:55Z thomas $
 */


/**
 * @see Zend_Date
 */
require_once 'Zend/Date.php';

/**
 * @see Zend_Service_Delicious_SimplePost
 */
require_once 'Zend/Service/Delicious/SimplePost.php';


/**
 * Zend_Service_Delicious_Post represents a post of a user that can be edited
 *
 * @category   Zend
 * @package    Zend_Service
 * @subpackage Delicious
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Service_Delicious_Post extends Zend_Service_Delicious_SimplePost
{
	/**
	 * Service that has downloaded the post
	 *
	 * @var Zend_Service_Delicious
	 */
	protected $_service;

	/**
	 * @var int Number of people that have the same post
	 */
	protected $_others;

	/**
	 * @var Zend_Date Post date
	 */
	protected $_date;

	/**
	 * @var bool Post share
	 */
	protected $_shared = true;

	/**
	 * @var string Post hash
	 */
	protected $_hash;

	/**
	 * Constructs a new del.icio.us post
	 *
	 * @param  Zend_Service_Delicious $service Service that has downloaded the post
	 * @param  DOMElement|array       $values  Post content
	 * @throws Zend_Service_Delicious_Exception
	 * @return void
	 */
	public function __construct(Zend_Service_Delicious $service, $values)
	{
		$this->_service = $service;

		if ($values instanceof DOMElement) {
			$values = self::_parsePostNode($values);
		}

		if (!is_array($values) || !isset($values['url']) || !isset($values['title'])) {
			/**
			 * @see Zend_Service_Delicious_Exception
			 */
			require_once 'Zend/Service/Delicious/Exception.php';
			throw new Zend_Service_Delicious_Exception("Second argument must be array with at least 2 keys ('url' and"
			. " 'title')");
		}

		if (isset($values['date']) && ! $values['date'] instanceof Zend_Date) {
			/**
			 * @see Zend_Service_Delicious_Exception
			 */
			require_once 'Zend/Service/Delicious/Exception.php';
			throw new Zend_Service_Delicious_Exception("Date has to be an instance of Zend_Date");
		}

		foreach (array('url', 'title', 'notes', 'others', 'tags', 'date', 'shared', 'hash') as $key) {
			if (isset($values[$key])) {
				$this->{"_$key"}  = $values[$key];
			}
		}
	}

	/**
	 * Setter for title
	 *
	 * @param  string $newTitle
	 * @return Zend_Service_Delicious_Post
	 */
	public function setTitle($newTitle)
	{
		$this->_title = (string) $newTitle;

		return $this;
	}

	/**
	 * Setter for notes
	 *
	 * @param  string $newNotes
	 * @return Zend_Service_Delicious_Post
	 */
	public function setNotes($newNotes)
	{
		$this->_notes = (string) $newNotes;

		return $this;
	}

	/**
	 * Setter for tags
	 *
	 * @param  array $tags
	 * @return Zend_Service_Delicious_Post
	 */
	public function setTags(array $tags)
	{
		$this->_tags = $tags;

		return $this;
	}

	/**
	 * Add a tag
	 *
	 * @param  string $tag
	 * @return Zend_Service_Delicious_Post
	 */
	public function addTag($tag)
	{
		$this->_tags[] = (string) $tag;

		return $this;
	}

	/**
	 * Remove a tag
	 *
	 * @param  string $tag
	 * @return Zend_Service_Delicious_Post
	 */
	public function removeTag($tag)
	{
		$this->_tags = array_diff($this->_tags, array((string) $tag));

		return $this;
	}

	/**
	 * Getter for date
	 *
	 * @return Zend_Date
	 */
	public function getDate()
	{
		return $this->_date;
	}

	/**
	 * Getter for others
	 *
	 * This property is only populated when posts are retrieved
	 * with getPosts() method. The getAllPosts() and getRecentPosts()
	 * methods will not populate this property.
	 *
	 * @return int
	 */
	public function getOthers()
	{
		return $this->_others;
	}

	/**
	 * Getter for hash
	 *
	 * @return string
	 */
	public function getHash()
	{
		return $this->_hash;
	}

	/**
	 * Getter for shared
	 *
	 * @return bool
	 */
	public function getShared()
	{
		return $this->_shared;
	}

	/**
	 * Setter for shared
	 *
	 * @param  bool $isShared
	 * @return Zend_Service_Delicious_Post
	 */
	public function setShared($isShared)
	{
		$this->_shared = (bool) $isShared;

		return $this;
	}

	/**
	 * Deletes post
	 *
	 * @return Zend_Service_Delicious
	 */
	public function delete()
	{
		return $this->_service->deletePost($this->_url);
	}

	/**
	 * Saves post
	 *
	 * @return DOMDocument
	 */
	public function save()
	{
		$parms = array(
            'url'        => $this->_url,
            'description'=> $this->_title,
            'extended'   => $this->_notes,
            'shared'     => ($this->_shared ? 'yes' : 'no'),
            'tags'       => implode(' ', (array) $this->_tags),
            'replace'    => 'yes'
            );
            /*
             if ($this->_date instanceof Zend_Date) {
             $parms['dt'] = $this->_date->get('Y-m-d\TH:i:s\Z');
             }
             */

            return $this->_service->makeRequest(Zend_Service_Delicious::PATH_POSTS_ADD, $parms);
	}

	/**
	 * Extracts content from the DOM element of a post
	 *
	 * @param  DOMElement $node
	 * @return array
	 */
	protected static function _parsePostNode(DOMElement $node)
	{
		return array(
            'url'    => $node->getAttribute('href'),
            'title'  => $node->getAttribute('description'),
            'notes'  => $node->getAttribute('extended'),
            'others' => (int) $node->getAttribute('others'),
            'tags'   => explode(' ', $node->getAttribute('tag')),
		/**
		 * @todo replace strtotime() with Zend_Date equivalent
		 */
            'date'   => new Zend_Date(strtotime($node->getAttribute('time'))),
            'shared' => ($node->getAttribute('shared') == 'no' ? false : true),
            'hash'   => $node->getAttribute('hash')
		);
	}
}
